/**
 * Created by MDURAND on 16/10/2014.
 */

helloseriesApp.controller("SerieCtrl",[ '$scope', '$log', '$http', 'PopupService', 'SerieService','SerieModel', 'HelloseriesSearchService',
    function ($scope, $log, $http, PopupService, SerieService, SerieModel, HelloseriesSearchService) {
        // Vars internes
        var nbSeriesInitiales = 0;
        var seriesOriginales = [];

        // Etat des serveurs BATCH & Rest
        $scope.statutBatch = "na";
        $scope.statutServeurRest = "na";

        // Liste des séries
        $scope.series = [];

        // Valeurs métiers
        $scope.serieAAjouter = new SerieModel();
        $scope.qualites = SerieModel.getQualites();
        $scope.versions = SerieModel.getVersions();

        $scope.rechercherSerie = function () {
            HelloseriesSearchService.searchSerie($scope.serieAAjouter).then(function ( retour) {
                $log.log(JSON.stringify(retour.data));
                if ( retour.data.length != 0) {
                    $scope.seriesATelecharger = retour.data;
                    PopupService.showPopupSeriesATelecharger($scope);
                }
                else {
                    PopupService.showPopupAucuneSerieATelecharger();
                }
            }, function () {
                PopupService.showPopupError();
            });
        };

        $scope.ajoutSerie = function () {
            addSerie($scope.series, $scope.serieAAjouter);
            addSerie(seriesOriginales, $scope.serieAAjouter);

            // Réinit objet serieAAjouter
            $scope.serieAAjouter = new SerieModel();
        };

        // Suppression de la série dans la liste courante
        $scope.removeSerie = function (serie) {
            for (var i = 0; i < $scope.series.length; i++) {
                if ($scope.series[i] === serie) {
                    $scope.series.splice(i, 1);
                    seriesOriginales.splice(i, 1);
                }
            }
        };

        //Récupération des infos via REST
        // Enregistrement des informations
        SerieService.query(
            function (response) {
                // Mémorisation des infos
                $scope.statutServeurRest = "ok";
                $scope.series = response;
                nbSeriesInitiales = $scope.series.length;
                angular.copy(response, seriesOriginales);
            },
            function () {
                $scope.statutServeurRest = "ko";
                seriesOriginales = [];
                nbSeriesInitiales = 0;
                PopupService.showPopupError();
            }
        );

        // Exposition du service au scope
        $scope.showPopupConfirmEnregistrement = function (){
            return PopupService.showPopupConfirmEnregistrement($scope);
        };

        $scope.doEnregistrement = function () {
            SerieService.save($scope.series,
                function (response) {
                    // Fermeture de la popup
                    PopupService.closeAllPopups();
                    // Prise en compte de la sauvegarde
                    seriesOriginales = $scope.series;
                    nbSeriesInitiales = $scope.series.length;
                    // Raz des flags "ajout"
                    for (var i = 0; i < $scope.series.length; i++) {
                        if ($scope.series[i].ajout) {
                            $scope.series[i].ajout = false;
                        }
                    }
                },
                function (response, param) {
                    PopupService.closeAllPopups();
                    PopupService.showPopupError();
                }
            );
        };

        $scope.isEnregistrementAllowed = function () {
            return $scope.getNbSeriesAjoutees() == 0 && $scope.getNbSeriesSupprimees() == 0 && $scope.getNbSeriesModifiees() == 0;
        };

        // Utils
        $scope.getNbSeriesAjoutees = function () {
            var nbSeriesAjoutees = 0;
            for (var i = 0; i < $scope.series.length; i++) {
                if ($scope.series[i].ajout) {
                    nbSeriesAjoutees++;
                }
            }
            return nbSeriesAjoutees;
        };

        $scope.getNbSeriesSupprimees = function () {
            return Math.max(0, nbSeriesInitiales - $scope.series.length + $scope.getNbSeriesAjoutees());
        };

        $scope.getNbSeriesModifiees = function () {
            var nbSeriesModifiees = 0;
            for (var i = 0; i < $scope.series.length; i++) {
                // Ignore des séries ajoutées
                if (isModified($scope.series[i])) {
                    nbSeriesModifiees++;
                }
            }
            return nbSeriesModifiees;
        };


        $scope.getCssClassForSerie = function (serie) {
            if (serie.ajout) {
                return "info";
            }
            else if (isModified(serie)) {
                return "danger";
            }
        };

        //Ajout de la série dans l'array cible
        function addSerie(arrayCible, serieAAjouter) {
            arrayCible.push({
                ajout: true,
                active: true,
                nom: capitalize(serieAAjouter.nom),
                episode: serieAAjouter.episode,
                saison: serieAAjouter.saison,
                version: serieAAjouter.version,
                qualite: serieAAjouter.qualite

            });

            sortJsonArrayByProperty(arrayCible, "nom");
        }

        function isModified(serie) {
            for (var i = 0; i < $scope.series.length; i++) {
                if (angular.equals($scope.series[i], serie)) {
                    return !angular.equals(serie, seriesOriginales[i]);
                }
            }
        }
    }

] );

function sortJsonArrayByProperty(objArray, prop, direction){
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments");
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending

    if (objArray && objArray.constructor===Array){
        var propPath = (prop.constructor===Array) ? prop : prop.split(".");
        objArray.sort(function(a,b){
            for (var p in propPath){
                if (a[propPath[p]] && b[propPath[p]]){
                    a = a[propPath[p]];
                    b = b[propPath[p]];
                }
            }
            // convert numeric strings to integers
            a = a.match(/^\d+$/) ? +a : a;
            b = b.match(/^\d+$/) ? +b : b;
            return ( (a < b) ? -1*direct : ((a > b) ? direct : 0) );
        });
    }
}

function capitalize (text) {
    return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
}

